package com.csqf.booksys.filter;

import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebFilter("/*")
public class EncodingFilter implements Filter {

    public EncodingFilter() {
        System.out.println("1、EncodingFilter（）");
    }
    
    /**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		 System.out.println("2、init(FilterConfig fConfig)");
	}
	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
		//处理请求编码
		//1、强转
		HttpServletRequest request = (HttpServletRequest)req;
		HttpServletResponse response = (HttpServletResponse)resp;
		//2、处理公用业务
		request.setCharacterEncoding("utf-8");//post
		response.setContentType("text/html;charset=utf-8");
		/*
		 * 出现GET中文乱码，是因为在request.getParameter方法内部没有进行提交方式判断并处理。
		 * String name = request.getParameter("userName");
		 * 解决：对指定接口的某一个方法进行功能扩展，可以使用代理!
		 *      对request对象(目标对象)，创建代理对象！
		 */
		HttpServletRequest proxy = (HttpServletRequest)Proxy.newProxyInstance(
				request.getClass().getClassLoader(), 
				request.getClass().getInterfaces(),
				new InvocationHandler(){//事件处理器
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						// 定义方法返回值
						Object returnVal = null;
						// 获取方法名
						String methodName = method.getName();
						// 判断：对getParameter方法进行GET提交中文处理
						if("getParameter".equals(methodName)){
							//获取请求数据值
							String value = request.getParameter(args[0].toString());
							System.out.println("处理前："+value);
							// 获取提交方式
						    String methodType = request.getMethod();
						 // 判断如果是GET提交，需要对数据进行处理  (POST提交已经处理过了)
						    if("GET".equals(methodType)){
						    	if(value != null && !"".equals(value.trim())){
						    		//手动处理
						    		value = new String(value.getBytes("iso-8859-1"),"utf-8");
						    		System.out.println("处理后："+value);
						    	}
						    }
						    
						    return value;
						}else{
							// 执行request对象的其他方法
							returnVal = method.invoke(request, args);
						}
						
						return returnVal;
					}
					
				});
		
		// 二、放行 (执行下一个过滤器或者servlet)
		chain.doFilter(proxy, response);//传入代理对象
	}
	
	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		System.out.println("6、destroy()");
	}
}
